// function curry(fn) {
//   return function curried(...args) {
//     if (args.length >= fn.length) {
//       console.log('this指向', this)
//       return fn.apply(this, args)
//     } else {
//       return function (...nextArgs) {
//         return curried.apply(this, args.concat(nextArgs))
//       }
//     }
//   }
// }

// // 使用
// function sum(a, b, c) {
//   return a + b + c
// }

// const curriedSum = curry(sum)

// console.log(curriedSum(1)(2)(3)) // 6
// console.log(curriedSum(1, 2)(3)) // 6
// console.log(curriedSum(1)(2, 3)) // 6

//通用柯里化函数
// function curry(fn) {
//   return function curried(...args) {
//     if (args.length >= fn.length) {
//       // 因为fn函数本质上也是个对象，所以.length方法获取的是定义时形参的数量。
//       return fn.call(this, ...args)
//     } else {
//       return function (...nextArgs) {
//         return curried.call(this, ...args.concat(nextArgs))
//       }
//     }
//   }
// }
// function sum(a, b, c, d) {
//   return a + b + c + d
// }
// const curriedSum = curry(sum)
// console.log(curriedSum(1)(2)(3)(4))
// console.log(curriedSum(1, 2)(3)(4))
// console.log(curriedSum(1)(2, 3)(4))

function sum(length) {
  let num = []
  function add(...args) {
    num.push(...args)
    if (num.length >= length) {
      const res = num.slice(0, length).reduce((item, sum) => item + sum, 0)
      num = []
      return res
    } else {
      return add
    }
  }
  return add
}
const too = sum(2)
// too(1)(2)(3)(4)(5)(6) // 21
// too((1, 2)(3)(4)(5, 6)) // 21
console.log(too(1, 2, 3, 4, 5, 6)) // 21
console.log(too(1, 2)(4, 5, 6)) // 21
// var a = 1
// function foo() {
//   var a = 2
//   function baz() {
//     console.log(a)
//   }
//   bar(baz)
// }

// function bar(fn) {
//   // 这就是闭包
//   fn()
// }

// foo() // 输出 2，而不是 1

// for (var i = 1; i <= 5; i++) {
//   setTimeout(
//     function (j) {
//       console.log(j)
//     },
//     0,
//     i,
//   )
// }
